package main

import "fmt"

/* 函数调用者声明为指针的好处：
1. 限定了方法调用者只能是某类型的指针或实例对象
2. 若调用该函数是一个实例对象，则底层会自动使用该对象的指针调用方法；
3. 若函数调用者为对象类型而不是指针类型，则无法修改结果体的值，只能是对象调用该函数，指针调用则方法无效
*/
func main() {
	var root treeNode
	root.setValue(100)
	root.print()
	pRoot := &root
	pRoot.setValue(200)
	pRoot.print()
}

type treeNode struct {
	value       int
	left, right *treeNode
}

func (node treeNode) print() {
	fmt.Println(node.value)
}

/* 自定义工厂函数创建结构体 */
func createNode(value int) *treeNode {
	return &treeNode{value: value}
}

func (node *treeNode) setValue(value int) {
	node.value = value
}
